/*************************************************************************
	> File Name: 005.HZOJ328.cpp
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 一  2/22 21:18:03 2021
 ************************************************************************/

/**
 *题目描述
在完成了分配任务之后，西部314来到了楼兰古城的西部。相传很久以前这片土地上(比楼兰古城还早)生活着两个部落，一个部落崇拜尖刀(‘V’)，一个部落崇拜铁锹('∧')，他们分别用V和∧的形状来代表各自部落的图腾。西部314在楼兰古城的下面发现了一幅巨大的壁画，壁画上被标记出了𝑁个点，经测量发现这𝑁个点的水平位置和竖直位置是两两不同的。西部314认为这幅壁画所包含的信息与这𝑁个点的相对位置有关，因此不妨设坐标分别为(1,𝑦1),(2,𝑦2),…,(𝑛,𝑦𝑛),其中𝑦1...𝑦𝑛是1到𝑛的一个排列。
西部314打算研究这幅壁画中包含着多少个图腾，其中V图腾的定义如下（注意：图腾的形式只和这三个纵坐标的相对大小排列顺序有关）1≤𝑖<𝑗<𝑘≤𝑛且𝑦𝑖>𝑦𝑗,𝑦𝑗<𝑦𝑘;

而崇拜∧的部落的图腾被定义为1≤𝑖<𝑗<𝑘≤𝑛且𝑦𝑖<𝑦𝑗,𝑦𝑗>𝑦𝑘;

西部314想知道，这𝑛个点中两个部落图腾的数目。因此，你需要编写一个程序来求出V的个数和∧的个数。

输入
第一行一个整数𝑛，代表点的个数𝑛≤200000
第二行是由空格分割开的𝑛个数，分别代表𝑦1，𝑦2……𝑦𝑛

输出
两个由空格分隔开的整数，代表V的个数和∧的个数，答案不超过(𝑙𝑜𝑛𝑔 𝑙𝑜𝑛𝑔)范围
 *
 */

//分析：
//根据题意，V型就是统计左侧比最低点大的值的个数a，右侧比最低点大的值的个数b，能形成V型的个数就是a * b
//同理，∧ 型的个数就是左右两侧小于最高点的个数相乘
//统计一个数前面比它小的数的个数的方法：标记数组，出现过的数标记为1，未出现过的数标记为0，统计前面比它小的数的个数就是查询标记数组到该位置为止的前缀和

#include <iostream>
using namespace std;

#define lowbit(x) (x & -x) 
#define MAX_N 200000

long long c[MAX_N + 5];

void add(long long i, long long x, long long n) {
    while (i <= n) {
        c[i] += x;
        i += lowbit(i);
    }
    return ;
}

long long query(long long i) {
    long long sum = 0;
    while (i) {
        sum += c[i];
        i -= lowbit(i);
    }
    return sum;
}

long long n;
long long val[MAX_N + 5];

void solve(long long &x, long long &y) {
    x = y = 0;
    for (long long i = 1; i <= n; i++) {
        long long a1 = query(val[i]); //统计前面比val[i]小的数的个数
        long long a2 = val[i] - a1 - 1; //统计后面比val[i]小的数的个数
        long long b1 = i - a1 - 1; //统计前面比val[i]大的数的个数
        long long b2 = n - val[i] - b1; //统计后面比val[i]大的数的个数
        x += a1 * a2; //获得^的个数
        y += b1 * b2; //获得V的个数
        add(val[i], 1, n); //将出现过的数在标记数组中标记为1
    }
    return ;
}

int main() {
    cin >> n;
    for (long long i = 1; i <= n; i++) cin >> val[i];
    long long a, b;
    solve(a, b);
    cout << b << " " << a << endl;
    return 0;
}
